<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-align/#distribution-block">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<style>
@import "/fonts/ahem.css";
body {
  font: 10px/1 Ahem;
}

td {
  padding: 0;
  height: 50px;
}

td:nth-child(2) {
  font-size: 20px;
}

.valign-top td {
  vertical-align: top;
}
.valign-middle td {
  vertical-align: middle;
}
.valign-bottom td {
  vertical-align: bottom;
}
.valign-middle-short td {
  vertical-align: middle;
  height: 10px;
}
.valign-bottom-short td {
  vertical-align: bottom;
  height: 10px;
}
.valign-baseline td {
  vertical-align: baseline;
}

.alignc-start td {
  align-content: start;
}
.alignc-center td {
  align-content: unsafe center;
}
.alignc-end td {
  align-content: unsafe end;
}
.alignc-center-short td {
  align-content: unsafe center;
  height: 10px;
}
.alignc-end-short td {
  align-content: unsafe end;
  height: 10px;
}
.alignc-baseline td {
  align-content: baseline;
}

.alignc-safe-center td {
  align-content: safe center;
}
.alignc-safe-end td {
  align-content: safe end;
}
.alignc-safe-center-short td {
  align-content: safe center;
  height: 10px;
}
.alignc-safe-end-short td {
  align-content: safe end;
  height: 10px;
}
</style>

<table border="0" id="ref" class="valign-baseline">
<tr>
<td><div class="content1">first<br>second</div></td>
<td><div class="content2">first<br>second</div></td>
<td><div class="content3">first<br>second<br>third</div></td>
</tr>
</table>

<table border="0" id="target" class="alignc-baseline">
<tr>
<td><div class="content1">first<br>second</div></td>
<td><div class="content2">first<br>second</div></td>
<td><div class="content3">first<br>second<br>third</div></td>
</tr>
</table>

<script>
function testEquivalence(target, ref) {
  assert_equals(target.querySelector('.content1').offsetTop,
      ref.querySelector('.content1').offsetTop, 'The first cell content top');
  assert_equals(target.querySelector('.content2').offsetTop,
      ref.querySelector('.content2').offsetTop, 'The second cell content top');
  assert_equals(target.querySelector('.content3').offsetTop,
      ref.querySelector('.content3').offsetTop, 'The third cell conten topt');
}

const ref = document.querySelector('#ref');
const target = document.querySelector('#target');
const TALL = 50;
// *-short specifies `height: 10px`, but cells ignore it, and the actual height
// is the maximum content height in the row.
const SHORT = 40;
const C1HEIGHT = 10 * 2;

test(() => {
  ref.className = 'valign-top';
  target.className = 'alignc-start';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, 0);
}, 'vertical-align:top and align-content:start are equivalent');

test(() => {
  ref.className = 'valign-middle';
  target.className = 'alignc-center';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2);

  ref.className = 'valign-middle-short';
  target.className = 'alignc-center-short';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, (SHORT - C1HEIGHT) / 2);
}, 'vertical-align:middle and `align-content:unsafe center` are equivalent');

test(() => {
  ref.className = 'valign-bottom';
  target.className = 'alignc-end';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT);

  ref.className = 'valign-bottom-short';
  target.className = 'alignc-end-short';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, SHORT - C1HEIGHT);
}, 'vertical-align:bottom and `align-content:unsafe end` are equivalent');

test(() => {
  ref.className = 'valign-baseline';
  target.className = 'alignc-baseline';
  testEquivalence(target, ref);
}, 'vertical-align:baseline and align-content:baseline are equivalent');

test(() => {
  ref.className = 'valign-middle';
  target.className = 'alignc-safe-center';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2);
}, 'vertical-align:middle and `align-content:safe center` are equivalent if the container is tall');

test(() => {
  ref.className = 'valign-bottom';
  target.className = 'alignc-safe-end';
  testEquivalence(target, ref);
  assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT);
}, 'vertical-align:bottom and `align-content:safe end` are equivalent if the container is tall');

test(() => {
  ref.className = 'alignc-center-short';
  target.className = 'alignc-safe-center-short';
  testEquivalence(target, ref);
}, '`align-content:safe center` is equivalent to `unsafe center` even if the specified `height` is short');

test(() => {
  ref.className = 'alignc-end-short';
  target.className = 'alignc-safe-end-short';
}, '`align-content:safe end` is equivalent to `unsafe end` even if the specified `height` is short');
</script>
